/*
 * PSMuxer.h
 *
 *  Created on: 2016年2月26日
 *      Author: terry
 */

#ifndef PSMUXER_H_
#define PSMUXER_H_

#include "BasicType.h"
#include "TByteBuffer.h"

namespace av
{

/**
 * PS 流混合器
 */
class PSMuxer
{
public:
	PSMuxer();
	virtual ~PSMuxer();

	/**
	 * 设置编码
	 * @param vCodec	视频编码
	 * @param aCodec	音频编码
	 * @return
	 */
	bool setCodec(int vCodec, int aCodec);

	/**
	 * 写入视频帧
	 * @param pktData	视频帧数据
	 * @param pktSize	数据长度
	 * @param keyFrame	是否为关键帧
	 * @param pts		时间戳,单位为 1/90000秒
	 * @param outData	输出数据指针
	 * @param outSize	输出数据长度
	 * @return	true 表示有输出
	 */
	bool writeVideo(uint8_t *pktData, int pktSize, bool keyFrame, int64_t pts, uint8_t *& outData, int& outSize);

	/**
	 * 写入音频帧
	 * @param pktData	音频数据
	 * @param pktSize	数据长度
	 * @param pts		时间戳,单位为 1/90000秒
	 * @param outData	输出数据指针
	 * @param outSize	输出数据长度
	 * @return	true 表示有输出
	 */
	bool writeAudio(uint8_t *pktData, int pktSize, int64_t pts, uint8_t *& outData, int& outSize);

	/**
	 * 写IMKH头
	 * PS流最开始是IMKH包, 不严格要求
	 * @param outData	输出数据指针
	 * @param outSize	输出数据长度
	 * @return	true 表示有输出
	 */
	bool writeIMKH(uint8_t *& outData, int& outSize);


	static int put_pack_header(uint8_t *buf, int64_t scr);
	static int put_system_header(uint8_t *buf, int stream_id);
	static uint8_t get_stream_type(int stream_codec_id);
	static int put_psm_header(uint8_t *buf, int videoId, int audioId);
	static int put_pes_header(uint8_t *buf, int stream_id, int pktSize, uint32_t ptsDtsFlag, int64_t pts, int64_t dts);

    void clear();

protected:
	int writePackHeader(int64_t pts);
	int writeSystemHeader(int streamID);
	int writePsmHeader(int videoCodec, int audioCodec);
	int writePesPacket(int streamID, uint8_t *data, int size, int flags, int64_t pts, int64_t dts);

protected:
	comn::ByteBuffer    m_buffer;
	int m_vCodec;
	int m_aCodec;

};



} /* namespace av */

#endif /* PSMUXER_H_ */
